double gps_save_version;
char gps_save_string[GPS_ARB_LEN];
+/*
+ * Internal function to copy what Garmin describes as a "Character Array".
+ * Dest buffer is padded with spaces and must not contain nulls. Optionally
+ * we uppercase the string because some models (III's and 12's) react
+ * violently to lower case data.
+ */
+typedef enum { UpperNo = 0, UpperYes = 1 } copycase;
+static
+void copy_char_array(UC **dst, UC* src, int count, copycase mustupper)
+{
+ UC *d = *dst;
+ int ocount = count;
+ do {
+ UC sc = *src++;
+ if (sc == 0) {
+ while (count--)
+ *d++ = ' ';
+ break;
+ }
+ else *d++ = mustupper == UpperYes ? toupper(sc) : sc;
+ } while (--count) ;
+ *dst += ocount;
+}
+
/* @func GPS_Init ******************************************************
**
p = data;
- for(i=0;i<6;++i) *p++ = way->ident[i];
+ copy_char_array(&p, way->ident, 6, UpperYes);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lat));
p+=sizeof(int32);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lon));
p+=sizeof(int32);
GPS_Util_Put_Uint(p,0);
p+=sizeof(int32);
- for(i=0;i<40;++i) *p++ = way->cmnt[i];
+ copy_char_array(&p, way->cmnt, 40, UpperYes);
*len = 58;
p = data;
- for(i=0;i<6;++i) *p++ = way->ident[i];
+ copy_char_array(&p, way->ident, 6, UpperYes);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lat));
p+=sizeof(int32);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lon));
p+=sizeof(int32);
GPS_Util_Put_Uint(p,0);
p+=sizeof(int32);
- for(i=0;i<40;++i) *p++ = way->cmnt[i];
+ copy_char_array(&p, way->cmnt, 40, UpperYes);
+
GPS_Util_Put_Float(p,way->dst);
p+= sizeof(float);
p = data;
- for(i=0;i<6;++i) *p++ = way->ident[i];
+ copy_char_array(&p, way->ident, 6, UpperYes);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lat));
p+=sizeof(int32);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lon));
p+=sizeof(int32);
GPS_Util_Put_Uint(p,0);
p+=sizeof(int32);
- for(i=0;i<40;++i) *p++ = way->cmnt[i];
+ copy_char_array(&p, way->cmnt, 40, UpperYes);
GPS_Util_Put_Float(p,way->dst);
p+= sizeof(float);
p = data;
- for(i=0;i<6;++i) {
- if (way->ident[i] == 0) {
- memset(p, ' ', 6-i);
- p+=6-i;
- break;
- }
- *p++ = way->ident[i];
- }
+ copy_char_array(&p, way->ident, 6, UpperYes);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lat));
p+=sizeof(int32);
p+=sizeof(int32);
GPS_Util_Put_Uint(p,0);
p+=sizeof(int32);
- for(i=0;i<40;++i) *p++ = way->cmnt[i];
+ copy_char_array(&p, way->cmnt, 40, UpperYes);
*p++ = way->smbl;
*p = way->dspl;
p = data;
- for(i=0;i<6;++i) *p++ = way->ident[i];
+ copy_char_array(&p, way->ident, 6, UpperYes);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lat));
p+=sizeof(int32);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lon));
* results in the comment being truncated there. So we uppercase
* the entire comment.
*/
- for(i=0;i<40;++i) *p++ = toupper(way->cmnt[i]);
+ copy_char_array(&p, way->cmnt, 40, UpperYes);
GPS_Util_Put_Float(p,way->dst);
p+= sizeof(float);
int32 i;
p = data;
- for(i=0;i<6;++i) *p++ = way->ident[i];
+
+ copy_char_array(&p, way->ident, 6, UpperYes);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lat));
p+=sizeof(int32);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lon));
p+=sizeof(int32);
GPS_Util_Put_Uint(p,0);
p+=sizeof(int32);
- for(i=0;i<40;++i) *p++ = way->cmnt[i];
+ copy_char_array(&p, way->cmnt, 40, UpperYes);
*p++ = way->smbl;
*p++ = way->dspl;
p = data;
- for(i=0;i<6;++i) *p++ = way->ident[i];
+ copy_char_array(&p, way->ident, 6, UpperYes);
for(i=0;i<2;++i) *p++ = way->cc[i];
if(way->wpt_class == 7) way->wpt_class = 0;
GPS_Util_Put_Short(p,way->alt);
p+=sizeof(int16);
- for(i=0;i<24;++i) *p++ = way->city[i];
- for(i=0;i<2;++i) *p++ = way->state[i];
- for(i=0;i<30;++i) *p++ = way->name[i];
- for(i=0;i<40;++i) *p++ = way->cmnt[i];
+ copy_char_array(&p, way->city, 24, UpperYes);
+ copy_char_array(&p, way->state, 2, UpperYes);
+ copy_char_array(&p, way->name, 30, UpperYes);
+ copy_char_array(&p, way->cmnt, 40, UpperYes);
*len = 115;
p = data;
- for(i=0;i<6;++i) *p++ = way->ident[i];
+ copy_char_array(&p, way->ident, 6, UpperYes);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lat));
p+=sizeof(int32);
p+=sizeof(int32);
GPS_Util_Put_Uint(p,0);
p+=sizeof(int32);
- for(i=0;i<40;++i) *p++ = way->cmnt[i];
+ copy_char_array(&p, way->cmnt, 40, UpperYes);
GPS_Util_Put_Float(p,way->dst);
p+=sizeof(float);
- for(i=0;i<30;++i) *p++ = way->name[i];
- for(i=0;i<24;++i) *p++ = way->city[i];
- for(i=0;i<2;++i) *p++ = way->state[i];
+ copy_char_array(&p, way->name, 30, UpperYes);
+ copy_char_array(&p, way->city, 24, UpperYes);
+ copy_char_array(&p, way->state, 2, UpperYes);
GPS_Util_Put_Short(p,way->alt);
p+=sizeof(int16);
p = data;
- for(i=0;i<6;++i) *p++ = way->ident[i];
+ copy_char_array(&p, way->ident, 6, UpperYes);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lat));
p+=sizeof(int32);
p+=sizeof(int32);
GPS_Util_Put_Uint(p,0);
p+=sizeof(int32);
- for(i=0;i<40;++i) *p++ = way->cmnt[i];
+ copy_char_array(&p, way->cmnt, 40, UpperYes);
GPS_Util_Put_Float(p,way->dst);
p+=sizeof(float);
- for(i=0;i<30;++i) *p++ = way->name[i];
- for(i=0;i<24;++i) *p++ = way->city[i];
- for(i=0;i<2;++i) *p++ = way->state[i];
+ copy_char_array(&p, way->name, 30, UpperYes);
+ copy_char_array(&p, way->city, 24, UpperYes);
+ copy_char_array(&p, way->state, 2, UpperYes);
GPS_Util_Put_Short(p,way->alt);
p+=sizeof(int16);
p = data;
- for(i=0;i<6;++i) *p++ = way->ident[i];
+ copy_char_array(&p, way->ident, 6, UpperYes);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lat));
p+=sizeof(int32);
p+=sizeof(int32);
GPS_Util_Put_Uint(p,0);
p+=sizeof(int32);
- for(i=0;i<40;++i) *p++ = way->cmnt[i];
+ copy_char_array(&p, way->cmnt, 40, UpperYes);
+
GPS_Util_Put_Float(p,way->dst);
p+=sizeof(float);
- for(i=0;i<30;++i) *p++ = way->name[i];
- for(i=0;i<24;++i) *p++ = way->city[i];
- for(i=0;i<2;++i) *p++ = way->state[i];
+ copy_char_array(&p, way->name, 30, UpperYes);
+ copy_char_array(&p, way->city, 24, UpperYes);
+ copy_char_array(&p, way->state, 2, UpperYes);
GPS_Util_Put_Short(p,way->alt);
p+=sizeof(int16);
p = data;
- for(i=0;i<6;++i) *p++ = way->ident[i];
+ copy_char_array(&p, way->ident, 6, UpperYes);
GPS_Util_Put_Int(p,(int32)GPS_Math_Deg_To_Semi(way->lat));
p+=sizeof(int32);
p+=sizeof(int32);
GPS_Util_Put_Uint(p,0);
p+=sizeof(int32);
- for(i=0;i<40;++i) *p++ = way->cmnt[i];
+ copy_char_array(&p, way->cmnt, 40, UpperYes);
GPS_Util_Put_Float(p,way->dst);
p+=sizeof(float);
- for(i=0;i<30;++i) *p++ = way->name[i];
- for(i=0;i<24;++i) *p++ = way->city[i];
- for(i=0;i<2;++i) *p++ = way->state[i];
+ copy_char_array(&p, way->name, 30, UpperYes);
+ copy_char_array(&p, way->city, 24, UpperYes);
+ copy_char_array(&p, way->state, 2, UpperYes);
GPS_Util_Put_Short(p,way->alt);
p+=sizeof(int16);